package basic_grammar

import (
	"errors"
	"fmt"
)

/*
表达式
func 函数名 (参数1 参数类型, 参数2 参数类型...) (返回值1) 返回值类型, (返回值2) 返回值类型{
}
*/

//函数是一种符合复合数据类型,是一个引用类型
//参数,变量,返回值都是可以是函数
//高阶函数(参数还是函数)
//闭包
//匿名函数

func TestFunc() {
	ParamFunc(func(s string) int {
		fmt.Println("传入参数为", s)
		return 200
	})

	//FuctionTest()
}

func FuctionTest() {
	a := adder()
	for i := 1; i <= 10; i++ {
		fmt.Println(a(i))
	}
}

func adder() func(int) int {
	sum := 0
	return func(v int) int {
		sum += v
		return sum
	}
}

// 尝试使用闭包完成fibonacci数列
func fibo() func() {
	a, b := 0, 1
	times := 1
	return func() {
		a, b = b, a+b
		fmt.Printf("第%d个数为%d\n", times, a)
		times++
	}
}

func TestFibo(num int) {
	f := fibo()
	for i := 0; i < num; i++ {
		f()
	}
}

/*
递归,有兴趣可以实现一下

func Peach(days int) int{
	if days==10{
		return 1
	}else{
		return (Peach(days+1)+1)*2
	}
}
*/

// 如果返回多个结果又不需要,可以使用_省略返回值
//
func Devide(a int, b int) (int, error) {
	if b != 0 {
		return a / b, nil
	}
	return 0, errors.New("被除数不能为0")
}

// 可以使用可变参数
func VariableParams(params ...int) {
	fmt.Printf("%T", params)
}

// 内置函数

func ParamFunc(getRes func(string) int) {
	params := "参数"
	res := getRes(params)
	switch res {
	case 200:
		fmt.Println("成功")
	case 500:
		fmt.Println("失败")
	case 404:
		fmt.Println("未找到")
	default:
		fmt.Println("over")
	}
}
